package com.neuedu.javase.thread;

// 模拟一个账户，其中有余额1000元。取钱时如果不足1000元就不能取。
public class Account {
    private int balance = 1000;
    // public synchronized void  qu(){
    public  void  qu(){
        System.out.println(  Thread.currentThread().getName()   + " balance = " + balance);

        synchronized( "this" ){ // 同步块
            if(balance>=1000){
                try {
                    // 模拟CPU时间片到期，导致的线程切换
                    Thread.sleep(100); //
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                balance -= 1000;
                System.out.println("取了1000元，balance = " + balance);
            }
        }
    }
}

class ThreadTest extends Thread{
    private Account account;
    public ThreadTest(Account account){
        this.account = account;
    }
    public void run(){    
        account.qu();            // 在线程类中调用取钱的方法
    }



    // 模拟多个人同时操作同一个账户。结果有可能出现这样一种情况：
// 账户中共有余额1000元，但却被取走了2000元。
    public static void main(String[] args) {
        Account account = new Account();
        ThreadTest tt1 = new ThreadTest(account);      // 给每个线程传入的是同一个账户
        ThreadTest tt2 = new ThreadTest(account);      // 给每个线程传入的是同一个账户
        tt1.start();
        tt2.start();
    }




}
